import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
import { formatAvailableTickets } from "./utils/index.js";

// 1. --- 配置区 ---
const transport = new SSEClientTransport(new URL("http://localhost:3000/sse"));

const client = new Client({
  name: "example-client",
  version: "1.0.0",
});

const searchDate = "2025-10-01";

// 所有需要查询的条件
const filterCriteria = [
  // 第一个对象将用于驱动表单的初始状态
  {
    queryName: "广深-安徽",
    trains: ["G2691", "G2694"],
    departures: ["惠东南", "深圳北"],
    arrivals: ["太湖南", "安庆"],
    allStations: [
      "潮汕",
      "普宁",
      "陆丰",
      "惠东南",
      "深圳北",
      "东莞南",
      "博罗北",
      "河源北",
      "龙川西",
      "和平北",
      "龙南东",
      "赣州西",
      "新干东",
      "南昌西",
      "庐山",
      "黄梅东",
      "太湖南",
      "安庆",
      "铜陵",
      "无为",
      "合肥南",
    ],
  },
  // {
  //   queryName: "深圳-太湖南1",
  //   trains: ["G2790"],
  //   departures: ["深圳", "河源东", "信丰西"],
  //   arrivals: ["德安", "庐山", "黄梅东", "太湖南", "安庆", "池州", "铜陵"],
  //   allStations: [
  //     "深圳",
  //     "河源东",
  //     "信丰西",
  //     "赣州西",
  //     "吉安西",
  //     "南昌西",
  //     "德安",
  //     "庐山",
  //     "黄梅东",
  //     "太湖南",
  //     "安庆",
  //     "池州",
  //     "铜陵",
  //     "芜湖",
  //     "马鞍山东",
  //     "南京南",
  //     "镇江",
  //     "常州",
  //     "苏州",
  //     "阳澄湖",
  //     "上海虹桥",
  //   ],
  // },
  // {
  //   queryName: "深圳-太湖南2",
  //   trains: ["G636"],
  //   departures: ["深圳北", "河源东", "龙川西"],
  //   arrivals: ["庐山", "宿松东", "太湖南", "安庆西", "桐城东"],
  //   allStations: [
  //     "深圳北",
  //     "河源东",
  //     "龙川西",
  //     "龙南东",
  //     "赣州西",
  //     "吉安西",
  //     "丰城东",
  //     "南昌西",
  //     "共青城",
  //     "庐山",
  //     "宿松东",
  //     "太湖南",
  //     "安庆西",
  //     "桐城东",
  //     "肥西",
  //     "合肥南",
  //   ],
  // },
  // {
  //   queryName: "深圳-太湖南3",
  //   trains: ["G2782"],
  //   departures: ["深圳", "仲恺", "惠州北"],
  //   arrivals: [
  //     "共青城",
  //     "庐山",
  //     "宿松东",
  //     "太湖南",
  //     "安庆",
  //     "池州",
  //     "铜陵",
  //     "芜湖",
  //     "南京南",
  //   ],
  //   allStations: [
  //     "深圳",
  //     "仲恺",
  //     "惠州北",
  //     "定南南",
  //     "赣州西",
  //     "吉安西",
  //     "南昌西",
  //     "共青城",
  //     "庐山",
  //     "宿松东",
  //     "太湖南",
  //     "安庆",
  //     "池州",
  //     "铜陵",
  //     "芜湖",
  //     "南京南",
  //   ],
  // },
  // {
  //   queryName: "深圳-太湖南4",
  //   trains: ["G2796"],
  //   departures: ["深圳", "惠州北", "龙川西"],
  //   arrivals: ["永修", "德安", "庐山", "太湖南", "潜山", "合肥南"],
  //   allStations: [
  //     "深圳",
  //     "惠州北",
  //     "龙川西",
  //     "赣州西",
  //     "吉安西",
  //     "峡江",
  //     "樟树东",
  //     "丰城东",
  //     "南昌西",
  //     "永修",
  //     "德安",
  //     "庐山",
  //     "太湖南",
  //     "潜山",
  //     "合肥南",
  //   ],
  // },
  // {
  //   queryName: "深圳-潜山",
  //   trains: ["G2698"],
  //   departures: ["深圳北", "东莞南", "惠州北", "河源东"],
  //   arrivals: [
  //     "新干东",
  //     "南昌西",
  //     "德安",
  //     "庐山",
  //     "黄梅东",
  //     "宿松东",
  //     "潜山",
  //     "安庆",
  //     "池州",
  //     "铜陵北",
  //   ],
  //   allStations: [
  //     "深圳北",
  //     "东莞南",
  //     "惠州北",
  //     "河源东",
  //     "信丰西",
  //     "赣州西",
  //     "新干东",
  //     "南昌西",
  //     "德安",
  //     "庐山",
  //     "黄梅东",
  //     "宿松东",
  //     "潜山",
  //     "安庆",
  //     "池州",
  //     "铜陵北",
  //     "巢湖东",
  //     "合肥南",
  //     "淮南东",
  //     "蚌埠南",
  //     "宿州东",
  //   ],
  // },
  // {
  //   queryName: "广州东-安徽",
  //   trains: ["G3082"],
  //   departures: ["广州东", "新塘", "增城", "惠州北", "河源东"],
  //   arrivals: ["永修", "共青城", "庐山", "太湖南", "合肥南"],
  //   allStations: [
  //     "广州东",
  //     "新塘",
  //     "增城",
  //     "惠州北",
  //     "河源东",
  //     "赣州西",
  //     "吉安西",
  //     "吉水西",
  //     "南昌西",
  //     "永修",
  //     "共青城",
  //     "庐山",
  //     "太湖南",
  //     "合肥南",
  //   ],
  // },
  // {
  //   queryName: "北京-安徽",
  //   trains: ["K1071"],
  //   departures: ["北京丰台", "任丘", "深州"],
  //   arrivals: ["天柱山", "太湖", "宿松"],
  //   allStations: [
  //     "北京丰台",
  //     "任丘",
  //     "深州",
  //     "衡水",
  //     "聊城",
  //     "菏泽",
  //     "曹县",
  //     "亳州",
  //     "阜阳",
  //     "合肥",
  //     "庐江",
  //     "桐城",
  //     "怀宁",
  //     "天柱山",
  //     "太湖",
  //     "宿松",
  //   ],
  // },
];

/**
 * 封装的函数，用于处理单个查询标准
 * @param {Client} client - SDK 客户端实例
 * @param {object} criteria - 单个查询对象，包含 queryName, trains 等
 * @param {string} date - 查询日期
 * @returns {Promise<object[]>} - 返回格式化后的票务结果数组
 */
async function processCriteria(client, criteria, date) {
  const { departures, arrivals, trains, queryName } = criteria;
  const allResults = [];

  // 为单个 criteria 内的组合查询创建并行任务
  const combinationPromises = [];
  for (const fromCity of departures) {
    for (const toCity of arrivals) {
      const promise = client
        .callTool({
          name: "search",
          arguments: {
            date: date,
            fromCity: fromCity,
            toCity: toCity,
          },
        })
        .then((result) => {
          console.log("result", result);
          console.log(`查询成功: ${date} 从 ${fromCity} 到 ${toCity}`);
          const resultHandle = JSON.parse(result?.content[0]?.text);
          if (Array.isArray(resultHandle)) {
            allResults.push(...resultHandle);
          }
        })
        .catch((error) => {
          console.error(
            `查询失败: ${date} 从 ${fromCity} 到 ${toCity}:`,
            error.message
          );
        });
      combinationPromises.push(promise);
    }
  }

  // 等待当前 criteria 下的所有组合查询完成
  await Promise.all(combinationPromises);

  // 对聚合后的结果进行格式化
  return formatAvailableTickets(allResults, queryName, date, trains);
}

/**
 * 主执行函数
 */
async function main() {
  console.log("开始批量查询任务...");
  try {
    // 2. --- 统一建立连接 ---
    await client.connect(transport);

    // 3. --- 创建所有查询任务的 Promise 数组 ---
    const promises = filterCriteria.map((criteria) =>
      processCriteria(client, criteria, searchDate)
    );

    // 4. --- 并行执行所有任务，并等待结果 ---
    const results = await Promise.allSettled(promises);

    // 5. --- 处理所有任务的结果 ---
    results.forEach((result, index) => {
      const queryName = filterCriteria[index].queryName;
      if (result.status === "fulfilled") {
        console.log(
          `\n✅ 任务 [${queryName}] 的最终筛选结果:`,
          JSON.stringify(result.value, null, 2)
        );
      } else {
        console.error(`\n❌ 任务 [${queryName}] 执行失败:`, result.reason);
      }
    });
  } catch (error) {
    console.error("执行主流程时发生意外错误:", error);
  } finally {
    // 6. --- 无论成功与否，都统一关闭连接 ---
    if (transport.isStarted) {
      await transport.stop();
      console.log("\n所有查询任务完成，连接已关闭。");
    }
  }
}

// 7. --- 启动主函数 ---
main();
